package problem.year2023.month05

import java.util.*

/**
 * @author LiangMu
 * @version \$Id: Day03.java, v 0.1, 2023年05月03日 15:32 LiangMu Exp $$
 */
object Day03 {
    /**
     * 给你一个字符串 s ，请你判断它是否 有效 。
     * 字符串 s 有效 需要满足：假设开始有一个空字符串 t = "" ，你可以执行 任意次 下述操作将 t 转换为 s ：
     *
     * 将字符串 "abc" 插入到 t 中的任意位置。形式上，t 变为 tleft + "abc" + tright，其中 t == tleft + tright 。注意，tleft 和 tright 可能为 空 。
     * 如果字符串 s 有效，则返回 true；否则，返回 false。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode.cn/problems/check-if-word-is-valid-after-substitutions
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */
    fun isValid(s: String): Boolean {
        var res = s
        var indexOf = s.indexOf("abc")
        while (indexOf != -1) {
            res = res.replace("abc", "")
            indexOf = res.indexOf("abc")
        }
        return res == ""
    }

    fun isValid2(s: String): Boolean {
        val chars = s.toCharArray()
        val stack = Stack<Char>()
        for (char in chars) {
            stack.push(char)
            if (stack.isNotEmpty() && stack.size >= 3) {
                val lastIndex = stack.lastIndex
                if (stack[lastIndex] == 'c' && stack[lastIndex - 1] == 'b' && stack[lastIndex - 2] == 'a') {
                    stack.pop()
                    stack.pop()
                    stack.pop()
                }
            }
        }
        return stack.isEmpty()
    }

    fun isValid3(s: String): Boolean {
        val chars = s.toCharArray()
        val builder = StringBuilder()
        for (char in chars) {
            builder.append(char)
            if (builder.length >= 3 && builder.substring(builder.length - 3) == "abc") {
                builder.delete(builder.length - 3, builder.length)
            }
        }
        return builder.isEmpty()
    }
}

fun main() {
    println(Day03.isValid("abcabcababcc"))
}
